package com.example.day2.closure;

public class ClosureTest1 {

    @FunctionalInterface
    interface Lambda {
        int op(int y);
    }

    static void highOrder(Lambda lambda) {
        System.out.println(lambda.op(1));
    }

    public static void main(String[] args) {
        /*
            函数对象的逻辑部分中,引用了外部的一个变量称之为闭包
            函数对象 (int y) -> x + y 与它外部的变量 x 形成了闭包

            effective final 即就是不加final修饰的变量,需要和final修饰的变量保持一致都不能被修改,这样的变量才就称为effective final
         */
//        int x = 10;
//        highOrder((int y) -> x + y);

        Student stu = new Student(20);
        // 这里stu对象被lambda引用,此时stu就是effective final变量就不能够被修改否则会报错
        Lambda lambda = y -> y + stu.d;
        highOrder(lambda);

        stu.d = 40;
        highOrder(lambda);
    }

    static class Student {
        int d;

        public Student(int d) {
            this.d = d;
        }
    }

    static int a = 1;
    int b = 2;

    public void test(int c) {
        highOrder(y -> a + y);
        highOrder(y -> b + y);
        highOrder(y -> c + y);
    }
}
